package main

import (
	"fmt"
	"log"
)

func main() {

	// 连接数据库
	db, err := connectDB("root", "12345678")
	if err != nil {
		log.Printf("数据库连接失败: %v", err)

		return
	}
	defer func() {
		if db != nil {
			db.Close()
		}
	}()

	// ping数据库检查连接
	if err := db.Ping(); err != nil {
		log.Printf("数据库ping失败: %v", err)
		return
	}
	log.Println("数据库连接成功!")
	dataBaseName := "SchoolDatabase"
	if err := createDb(db, dataBaseName); err != nil {
		log.Printf("数据库 %v创建失败", dataBaseName)
		return
	}

	tableName := "students"
	// 删除旧表（如果存在）重新创建
	db.Exec("DROP TABLE IF EXISTS students")
	if err := createTable(db, tableName); err != nil {
		log.Printf("创建表 %v失败", tableName)
		return
	}
	if err := inserTable(db, tableName, "张三", 20, "三年级"); err != nil {
		log.Printf("插入数据失败")
		return
	}
	if err := inserTable(db, tableName, "李四", 9, "五年级"); err != nil {
		log.Printf("插入数据失败")
		return
	}
	if err := inserTable(db, tableName, "王五", 18, "高二"); err != nil {
		log.Printf("插入数据失败")
		return
	}
	if err := inserTable(db, tableName, "刘六", 24, "大三"); err != nil {
		log.Printf("插入数据失败")
		return
	}

	studentList, err := queryGreaterAgeTable(db, tableName, 18)
	if err != nil {
		log.Printf("查询数据失败")
		return
	}
	fmt.Println("年龄大于18岁学生信息", studentList)

	if err := updateTable(db, tableName, "张三", "四年级"); err != nil {
		log.Printf("更新数据失败")
		return
	}

	if err := deleteLessenAgeTable(db, tableName, 15); err != nil {
		log.Printf("删除数据失败")
		return
	}

	fmt.Println("\n=== 开始测试转账功能 ===")

	// 删除旧表（如果存在）重新创建
	// db.Exec("DROP TABLE IF EXISTS transactions")
	// db.Exec("DROP TABLE IF EXISTS accounts")

	// 创建账户表和交易表
	if err := createAccountsTable(db); err != nil {
		log.Printf("创建账户表失败: %v", err)
		return
	}

	if err := createTransactionsTable(db); err != nil {
		log.Printf("创建交易表失败: %v", err)
		return
	}

	// 插入测试账户数据
	if err := insertTestAccounts(db); err != nil {
		log.Printf("插入测试账户失败: %v", err)
		return
	}

	// 显示转账前的账户余额
	fmt.Println("\n=== 转账前账户余额 ===")
	accounts := []string{"A", "B", "C"}
	for _, accountID := range accounts {
		balance, err := queryAccountBalance(db, accountID)
		if err != nil {
			log.Printf("查询账户%s余额失败: %v", accountID, err)
		} else {
			fmt.Printf("账户 %s 余额: %.2f 元\n", accountID, balance)
		}
	}

	// 测试转账：从账户A向账户B转账100元
	fmt.Println("\n=== 执行转账：从账户A向账户B转账100元 ===")
	if err := TransferMoney(db, "A", "B", 100.00); err != nil {
		log.Printf("转账失败: %v", err)
	}

	// 测试转账：从账户C向账户A转账300元（余额不足，应该失败）
	fmt.Println("\n=== 执行转账：从账户C向账户A转账300元（余额不足） ===")
	if err := TransferMoney(db, "C", "A", 300.00); err != nil {
		log.Printf("转账失败（符合预期）: %v", err)
	}

	// 显示转账后的账户余额
	fmt.Println("\n=== 转账后账户余额 ===")
	for _, accountID := range accounts {
		balance, err := queryAccountBalance(db, accountID)
		if err != nil {
			log.Printf("查询账户%s余额失败: %v", accountID, err)
		} else {
			fmt.Printf("账户 %s 余额: %.2f 元\n", accountID, balance)
		}
	}

	// 显示交易历史
	fmt.Println()
	if err := queryTransactionHistory(db); err != nil {
		log.Printf("查询交易历史失败: %v", err)
	}

}
